package com.epcs.model.bo;

import java.util.ArrayList;
import java.util.List;

import com.epcs.model.dao.EventDAO;
import com.epcs.model.dao.FollowingDAO;
import com.epcs.model.dao.NotificationDAO;
import com.epcs.model.dto.*;
import com.epcs.util.EpcsDateTimeUtil;

public class NotificationBO {
	NotificationDAO notification = new NotificationDAO();

	public List<Notification> loadAllNotification1(List<Following> followingList) {
		return notification.getAllNotification1(followingList);
	}
	public List<Notification> loadAllNotification(Following following) {
		return notification.getAllNotification(following);
	}

	public List<Notification> loadUnloadNotification(List<Following> followingList) {
		return notification.getUnloadNotification(followingList);
	}

	public boolean updateNotification(int notificationID) {
		return notification.updateNotification(notificationID);
	}
	
	public boolean updateNotificationbyID(Notification notify) {
		return notification.updateNotificationbyID(notify);
	}
	
	public boolean insertNotification(Notification notificaiton) {
		NotificationDAO notify = new NotificationDAO();
		return notify.insertNotificationToDB(notificaiton);
	}

	public boolean deleteNotification(Notification notificaiton) {
		NotificationDAO notify = new NotificationDAO();
		return notify.deleteNotification(notificaiton);
	}

	public List<Notification> getNotificationByFollowing(Following following) {
		NotificationDAO notify = new NotificationDAO();
		return notify.getNotificationByFollowing(following);
	}

	public Notification getNotificationByType(Following following, String type) {
		NotificationDAO notify = new NotificationDAO();
		return notify.getNotificationByType(following, type);
	}
	
	public boolean updateNotificationComment(Notification notification) {
		NotificationDAO notify = new NotificationDAO();
		return notify.updateNotificationComment(notification);
	}

	public boolean createNotificationForCommingEvent(Account account) {
		EventBO eventBO = new EventBO();
		FollowingBO followBO = new FollowingBO();
		NotificationDAO notificationDAO = new NotificationDAO();
		int eventId;
		String currentTime = EpcsDateTimeUtil.getCurrentIsoDateTime();
		String outputDateTime;

		/*// lấy danh sách event người đó đang theo dõi
		List<Following> listFollowing = followBO
				.getFollowingEventByAccount(account);*/

		// Duyệt list following để lấy danh sách event đang theo dõi
		/*List<Event> listEvent = new ArrayList<Event>();
		if (listFollowing != null) {
			for (int i = 0; i < listFollowing.size(); i++) {
				// lấy của eventId dựa theo following
				int eventId = listFollowing.get(i).getIdOfFollow();
				// lấy Event dựa trên eventId vừa lấy được
				Event event = eventBO.getEvent(String.valueOf(eventId));
				listEvent.add(event);
			}
		}*/
		
		//lấy list event của account hiện tại
		List<Event> listEvent =  eventBO.getAllEvent(account);

		// duyệt list event đang theo dõi của user 
		if (listEvent != null) {
			for (int i = 0; i < listEvent.size(); i++) {
				Event eventListItem = listEvent.get(i);
				boolean isAllDay = eventListItem.getIsAllDayEvent();
				// lấy reminder của event
				long reminder = listEvent.get(i).getReminderTime();
				// So sánh thời gian bắt đầu của event với thời gian hiện tại
				long time = EpcsDateTimeUtil.compareCurrentTimeWithString(listEvent.get(i).getStartTime());
				//So sánh thời gian kết thúc với thời gian hiện tại
				long time1 = EpcsDateTimeUtil.compareCurrentTimeWithString(listEvent.get(i).getEndTime());
				// kiểm tra xem event này đc thông báo chưa
				if (eventListItem.getIsNotified() == false) {
					if(isAllDay){
						 outputDateTime = EpcsDateTimeUtil.convertDateTimeWithPattern(eventListItem.getStartTime(), "'vào ngày' dd-MM-yyy");
					}else{
						 outputDateTime = EpcsDateTimeUtil.convertDateTimeWithPattern(eventListItem.getStartTime(), "'lúc 'HH'h'mm, 'ngày' dd-MM-yyy");
					}
					
					// event chưa được thông báo và time nằm trong khoảng
					// reminder tới lúc bắt đầu sự kiện
					if (reminder >= time && time >0) {
						// lấy list following event
						
						if(eventListItem.getOrganizer() == null){
							eventId = eventListItem.getEventId();
						}else{
							eventId = eventListItem.getOriginalEvent().getEventId();
						}
						Following Following  = followBO.loadFollowing(account, eventId);
					  
								// kiểm tra đã tồn tại notification của follow
								// đó chưa
								// chưa có thì tạo mới
								// có rồi thì update lại status và content
								if (getNotificationByType(Following,"timmer") == null) {
									// khởi tạo object notification
									Notification notify = new Notification();
									notify.setStatus(0);
									notify.setTypeOfNotification("timmer");
									notify.setFollowing(Following);
									notify.setContent("Bạn có sự kiện diễn ra "+ outputDateTime);
									notify.setLastUpdated(currentTime);
									insertNotification(notify);
								} else {
									Notification exitNotification = getNotificationByType(Following, "timmer");
									// khởi tạo object notification
									Notification notification = notificationDAO.getNotification(exitNotification.getNotificationId());
									notification.setStatus(0);
									notification.setTypeOfNotification("timmer");
									String dateTime = eventListItem.getStartTime();
									notification.setFollowing(Following);
									notification.setContent("Bạn có sự kiện diễn ra "+ outputDateTime);
									notification.setLastUpdated(currentTime);
									notificationDAO.updateNotificationbyID(notification);
								}
						
						//Set trạng thái của event là đã thông báo
						listEvent.get(i).setIsNotified(true);
						eventBO.updateEvent(listEvent.get(i));
					} else if(time<0 && time1>0){
						if(eventListItem.getOrganizer() == null){
							eventId = eventListItem.getEventId();
						}else{
							eventId = eventListItem.getOriginalEvent().getEventId();
						}
						Following Following  = followBO.loadFollowing(account, eventId);
						
						// kiểm tra đã tồn tại notification của follow
						// đó chưa
						// chưa có thì tạo mới
						// có rồi thì update lại status và content
						if (getNotificationByType(Following,"timmer") == null) {
							// khởi tạo object notification
							Notification notify = new Notification();
							notify.setStatus(0);
							notify.setTypeOfNotification("timmer");
							notify.setFollowing(Following);
							notify.setContent("Bạn có sự kiện đã diễn ra "+ outputDateTime);
							notify.setLastUpdated(currentTime);
							insertNotification(notify);
						} else {
							Notification exitNotification = getNotificationByType(Following, "timmer");
							// khởi tạo object notification
							Notification notification = notificationDAO.getNotification(exitNotification.getNotificationId());
							notification.setStatus(0);
							notification.setTypeOfNotification("timmer");
							String dateTime = eventListItem.getStartTime();
							notification.setFollowing(Following);
							notification.setContent("Bạn có sự kiện diễn đã ra "+ outputDateTime);
							notification.setLastUpdated(currentTime);
							notificationDAO.updateNotificationbyID(notification);
						}
						//Set trạng thái của event là đã thông báo
						listEvent.get(i).setIsNotified(true);
						eventBO.updateEvent(listEvent.get(i));
					} else if(time1<0){
						if(eventListItem.getOrganizer() == null){
							eventId = eventListItem.getEventId();
						}else{
							eventId = eventListItem.getOriginalEvent().getEventId();
						}
						Following Following  = followBO.loadFollowing(account, eventId);
						
						// kiểm tra đã tồn tại notification của follow
						// đó chưa
						// chưa có thì tạo mới
						// có rồi thì update lại status và content
						if (getNotificationByType(Following,"timmer") == null) {
							// khởi tạo object notification
							Notification notify = new Notification();
							notify.setStatus(0);
							notify.setTypeOfNotification("timmer");
							notify.setFollowing(Following);
							notify.setContent("Bạn có sự kiện đã kết thúc "+ outputDateTime);
							notify.setLastUpdated(currentTime);
							insertNotification(notify);
						} else {
							Notification exitNotification = getNotificationByType(Following, "timmer");
							// khởi tạo object notification
							Notification notification = notificationDAO.getNotification(exitNotification.getNotificationId());
							notification.setStatus(0);
							notification.setTypeOfNotification("timmer");
							String dateTime = eventListItem.getEndTime();
							notification.setFollowing(Following);
							notification.setContent("Bạn có sự kiện diễn đã kết thúc "+ outputDateTime);
							notification.setLastUpdated(currentTime);
							notificationDAO.updateNotificationbyID(notification);
						}
						//Set trạng thái của event là đã thông báo
						listEvent.get(i).setIsNotified(true);
						eventBO.updateEvent(listEvent.get(i));
					}
				}
				}
			}
		return true;
	}
	
	public Notification getNotificationByNotificationID(int notificationId) {
		NotificationDAO notify = new NotificationDAO();
		return notify.getNotification(notificationId);
	
	}
	public List<Notification> getAllNotificationForAccount(Account account){
		FollowingBO followingBO = new FollowingBO();
		NotificationDAO notificationDAO = new NotificationDAO();
		
		List<Following> followingList = followingBO.loadAllNotification(account);
		if(followingList!=null){
			List<Notification> notificationList =notificationDAO.getAllNotificationForAccount(followingList);
			return notificationList;
		}
		return null;
	}
	public Following getFollowingByNotificationId(int notificationID){
		NotificationDAO notificationDAO = new NotificationDAO();
		Notification notification = notificationDAO.getNotification(notificationID);
		if(notification!=null){
			notification.setStatus(2);
			notificationDAO.updateNotificationbyID(notification);
			Following following = notification.getFollowing();
			return following;
		}
		return null;
	}
	public List<String> getTitlebyNotification(List<Notification> notificationList){
		List<String> titleEventList = new ArrayList<String>();
		EventDAO eventDAO = new EventDAO(); 
		for(int i = 0 ; i <notificationList.size(); i++){
			int id = notificationList.get(i).getFollowing().getIdOfFollow();
			titleEventList.add(eventDAO.getTitleByID(id));
		}
		return titleEventList;
	}
}
